/**
 * Clase PantallaMenuPrincipal: el Menu Principal de la aplicacion movil para pacientes
 */

package infbmobile.pantallas;

// Importaciones externas
import java.io.*;
import java.util.*;
import com.sun.lwuit.*;
import com.sun.lwuit.animations.CommonTransitions;
import com.sun.lwuit.animations.Transition;
import com.sun.lwuit.events.ActionEvent;
import com.sun.lwuit.layouts.*;
import com.sun.lwuit.plaf.Style;
import com.sun.lwuit.events.ActionListener;

// Importaciones internas
import infbmobile.almacenamiento.Identificacion;
import infbmobile.main.*;
import infbmobile.util.*;
import infbmobile.errores.*;


public class PantallaMenuPrincipal extends Form implements ActionListener {
    // Referencia al midlet principal
    public InfBMobile midlet;

    // Atributos de clase
    // Nombre de todas las pantallas que forman el menu principal
    public static String[] pantallas=new String[]{"Citas","Medicamentos","Simulador","Tratamiento","Dolencias","Reset"};

    // Hash de asociacion de botones a pantallas
    private Hashtable hashBotonesPantallas;
    private int numFilas;
    private int numColumnas;
    private Command comandoSalir;
    private Command comandoAbout;
    
    /**
     * Constructor principal de la clase
     */
    public PantallaMenuPrincipal(InfBMobile midlet) {
        super("Menu Principal - HospiGest Pacientes");
        this.midlet=midlet;
        // Creamos el hastable de botones a pantallas
        hashBotonesPantallas=new Hashtable();
        // Ancho maximo de un boton (abajo explicado) y ancho de la pantalla
        int anchoMaxBoton=0;
        int anchoPantalla=Display.getInstance().getDisplayWidth();
        // Creamos arrays con las imagenes que tendran los botones de opcion de menu
        // cuando esten seleccionados (in) y no seleccionados (out)
        Image[] iconosIn=new Image[pantallas.length];
        Image[] iconosOut=new Image[pantallas.length];
        // Cargamos los iconos
        for(int i=0;i<pantallas.length;i++){
            // Obtenemos las imagenes de los iconos
            try{
                iconosIn[i]=Image.createImage("/res/iconos/"+pantallas[i]+"_IN.png");
                iconosOut[i]=Image.createImage("/res/iconos/"+pantallas[i]+"_OUT.png");
            }catch(IOException ioe){
                ioe.printStackTrace();
            }
            // Creamos el boton con el icono
            Button boton=new Button(pantallas[i],iconosOut[i]);
            // Modificamos la aparencia del boton
            Style estiloBoton=boton.getStyle();
            estiloBoton.setBorder(null);
            estiloBoton.setBgTransparency(0);
            // Centramos el texto del boton y lo posicionamos debajo de la imagen
            boton.setAlignment(Label.CENTER);
            boton.setTextPosition(Label.BOTTOM);
            // Establecemos la imagen a mostrar cuando el icono sea seleccionado
            boton.setRolloverIcon(iconosIn[i]);
            boton.addActionListener(this);
            // Creamos la asociacion del boton a la pantalla
            hashBotonesPantallas.put(boton,pantallas[i]);
            // Agregamos el boton al formulario
            addComponent(boton);
            // De todos los botones procesados, nos quedamos con aquel de anchura maxima
            // pues el sera el que determinara cuantas "columnas" dispondra la pantalla
            // (puesto que el numero de columnas va en funcion de la maxima anchura de
            // un elemento mostrado por pantalla)
            anchoMaxBoton=Math.max(boton.getPreferredW(),anchoMaxBoton);
        }
        // Ya una vez acabado el bucle de carga de iconos procemos
        // a fijar las dimensiones de la reticula de pantalla
        numColumnas=anchoPantalla / anchoMaxBoton;
        numFilas=pantallas.length / numColumnas;
        setLayout(new GridLayout(numFilas,numColumnas));
        // Agregamos los comandos        
        comandoSalir=new Command("Salir");
        addCommand(comandoSalir);
        comandoAbout=new Command("About");
        addCommand(comandoAbout);
        setCommandListener(this);
    }

    /**
     * Metodo auxiliar para cargar una pantalla concreta desde el menu central
     * de la aplicacion movil para pacientes
     * @param pantalla El nombre de la pantalla a cargar
     */
    private void cargarPantalla(String pantalla) {
        if(pantalla.equalsIgnoreCase("Citas")){
            // Mostramos la pantalla de citas
             midlet.mostrarPantallaPrincipalCitas();
        }else if(pantalla.equalsIgnoreCase("Medicamentos")){
            // Mostramos la pantalla de busqueda de medicamentos
            midlet.mostrarPantallaBusquedaMedicamentos();
        }else if(pantalla.equalsIgnoreCase("Simulador")){
            // Mostramos la pantalla del simulador
            midlet.mostrarPantallaSimulador();
        }else if(pantalla.equalsIgnoreCase("Tratamiento")){
            // Mostramos la pantalla de tratamiento actual
            midlet.mostrarPantallaTratamiento();
        }else if(pantalla.equalsIgnoreCase("Dolencias")){
            // Mostramos la pantalla de envio de fotos asociadas a dolencias
            midlet.mostrarPantallaCamara();
        }else if(pantalla.equalsIgnoreCase("Reset")){
            // Mostramos la pantalla de reset o limpiado de informacion privada
            midlet.mostrarPantallaReset();
        }
    }

    public void actionPerformed(ActionEvent evento) {
        Object fuente=evento.getSource();
        // Recogemos los eventos
        if(fuente==comandoSalir){
            // Mostramos dialogo de confirmacion de salida de aplicacion
            Command comandoOk=new Command("OK");
            Command comandoCancelar=new Command("Cancelar");
            Transition transicion=CommonTransitions.createSlide(CommonTransitions.SLIDE_VERTICAL,true,1000);
            Dialog d=new Dialog("Confirmacion de Salida");
            d.setLayout(new BorderLayout());
            Label l=new Label("Pulse OK para salir");
            l.setAlignment(CENTER);
            d.addComponent(BorderLayout.CENTER,l);
            d.addCommand(comandoOk);
            d.addCommand(comandoCancelar);
            d.setCommandListener(new DialogoListener(midlet));
            d.show();
        }else if(fuente==comandoAbout){
            UIHerramientas.mostrarAviso("About HospiGest Mobile","Version 1.0\n Desarrollado por el grupo INFB");
        }else{
            // Detectamos el icono pulsado
            String pantalla=(String)hashBotonesPantallas.get(fuente);
            cargarPantalla(pantalla);
        }

    }

}

/*
 * Clase DialogoListener: Clase interna destinada a la gestion de los eventos que genera
 * el dialogo de confirmacion de salida
 */
class DialogoListener implements ActionListener {
    // Referencia al midlet principal
    private InfBMobile midlet;

    public DialogoListener(InfBMobile midlet){
        this.midlet=midlet;
    }

    /**
     * Dado que los dialogos se ejecutan de forma bloqueante, debemos especificar
     * una clase propia para escuchar los eventos que el mismo genera
     */
    public void actionPerformed(ActionEvent evento){
        Command comando=evento.getCommand();
        if(comando.getCommandName().equalsIgnoreCase("OK")){
            // Eliminamos el rms de la sesion de usuario
            Identificacion.borrar("sesion");
            // Salimos de la aplicacion principal despues de aceptar la confirmacion
            midlet.salir();
        }
    }
}
